{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for Otto Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们以Kaggle 2015年举办的Otto Group Product Classification Challenge竞赛数据为例，进行XGBoost参数调优探索。\n",
    "\n",
    "竞赛官网：https://www.kaggle.com/c/otto-group-product-classification-challenge/data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二步：调整树的参数：max_depth & min_child_weight\n",
    "(粗调，参数的步长为2；下一步是在粗调最佳参数周围，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先 import 必要的模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"Otto_train.csv\")\n",
    "#train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Variable Identification"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "选择该数据集是因为的数据特征单一，我们可以在特征工程方面少做些工作，集中精力放在参数调优上"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Target 分布，看看各类样本分布是否均衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "#sns.countplot(train.target);\n",
    "#pyplot.xlabel('target');\n",
    "#pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "每类样本分布不是很均匀，所以交叉验证时也考虑各类样本按比例抽取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_train = train['target']\n",
    "y_train = y_train.map(lambda s: s[6:])\n",
    "y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop([\"id\", \"target\"], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（699），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用交叉验证评价模型性能时，用scoring参数定义评价指标。评价指标是越高越好，因此用一些损失函数当评价指标时，需要再加负号，如neg_log_loss，neg_mean_squared_error 详见sklearn文档：http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [6, 7, 8], 'min_child_weight': [4, 5, 6]}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [6,7,8]\n",
    "min_child_weight = [4,5,6]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/anaconda/lib/python2.7/site-packages/sklearn/model_selection/_search.py:667: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -1.84136, std: 0.00769, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -1.84238, std: 0.00749, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -1.84323, std: 0.00751, params: {'max_depth': 6, 'min_child_weight': 6},\n",
       "  mean: -1.81985, std: 0.00637, params: {'max_depth': 7, 'min_child_weight': 4},\n",
       "  mean: -1.82191, std: 0.00701, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -1.82330, std: 0.00645, params: {'max_depth': 7, 'min_child_weight': 6},\n",
       "  mean: -1.80834, std: 0.00212, params: {'max_depth': 8, 'min_child_weight': 4},\n",
       "  mean: -1.80986, std: 0.00319, params: {'max_depth': 8, 'min_child_weight': 5},\n",
       "  mean: -1.81517, std: 0.00701, params: {'max_depth': 8, 'min_child_weight': 6}],\n",
       " {'max_depth': 8, 'min_child_weight': 4},\n",
       " -1.8083446011360949)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=699,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_,     gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 3.57938142,  3.93679004,  4.06462259,  4.39477878,  4.70106964,\n",
       "         4.42871919,  4.62651081,  4.8598866 ,  3.962538  ]),\n",
       " 'mean_score_time': array([ 0.16824541,  0.14223194,  0.13564043,  0.16858616,  0.1231173 ,\n",
       "         0.14664741,  0.16257501,  0.12763515,  0.06810622]),\n",
       " 'mean_test_score': array([-1.84136204, -1.84237886, -1.84322873, -1.8198477 , -1.82191243,\n",
       "        -1.82329889, -1.8083446 , -1.80985913, -1.81516758]),\n",
       " 'mean_train_score': array([-1.83776295, -1.83888738, -1.8399246 , -1.81507921, -1.81775794,\n",
       "        -1.81912688, -1.80270276, -1.80492046, -1.81054239]),\n",
       " 'param_max_depth': masked_array(data = [6 6 6 7 7 7 8 8 8],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_min_child_weight': masked_array(data = [4 5 6 4 5 6 4 5 6],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': ({'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 6},\n",
       "  {'max_depth': 7, 'min_child_weight': 4},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 6},\n",
       "  {'max_depth': 8, 'min_child_weight': 4},\n",
       "  {'max_depth': 8, 'min_child_weight': 5},\n",
       "  {'max_depth': 8, 'min_child_weight': 6}),\n",
       " 'rank_test_score': array([7, 8, 9, 4, 5, 6, 1, 2, 3], dtype=int32),\n",
       " 'split0_test_score': array([-1.84528365, -1.8458723 , -1.84665005, -1.81306277, -1.81534182,\n",
       "        -1.81591901, -1.80891935, -1.81205914, -1.81280519]),\n",
       " 'split0_train_score': array([-1.84262624, -1.84326086, -1.84434615, -1.80799376, -1.80999227,\n",
       "        -1.811352  , -1.80249619, -1.80698744, -1.80740214]),\n",
       " 'split1_test_score': array([-1.82903566, -1.83044542, -1.83121874, -1.82540792, -1.82619675,\n",
       "        -1.8269378 , -1.80908756, -1.81073743, -1.81317747]),\n",
       " 'split1_train_score': array([-1.82649585, -1.8281045 , -1.82934103, -1.82200446, -1.82399422,\n",
       "        -1.82487677, -1.80557458, -1.80766007, -1.81054812]),\n",
       " 'split2_test_score': array([-1.84929565, -1.85003318, -1.85120053, -1.81659218, -1.81827517,\n",
       "        -1.81921202, -1.80594192, -1.80747588, -1.8274021 ]),\n",
       " 'split2_train_score': array([-1.84423252, -1.84532585, -1.84612234, -1.81224431, -1.81502997,\n",
       "        -1.81641418, -1.7996265 , -1.80224442, -1.82274363]),\n",
       " 'split3_test_score': array([-1.84732721, -1.84854463, -1.84911118, -1.81482409, -1.81611468,\n",
       "        -1.82038809, -1.80613126, -1.80507543, -1.80596024]),\n",
       " 'split3_train_score': array([-1.84472844, -1.84622177, -1.84687009, -1.81098545, -1.81286745,\n",
       "        -1.81532053, -1.80069988, -1.79989172, -1.80150951]),\n",
       " 'split4_test_score': array([-1.8358662 , -1.83699697, -1.83796144, -1.82935601, -1.8336392 ,\n",
       "        -1.83404277, -1.8116441 , -1.81394898, -1.81649396]),\n",
       " 'split4_train_score': array([-1.83073169, -1.8315239 , -1.83294337, -1.82216809, -1.82690579,\n",
       "        -1.82767092, -1.80511663, -1.80781867, -1.81050857]),\n",
       " 'std_fit_time': array([ 0.47299031,  0.32854824,  0.11920913,  0.22024785,  0.18955198,\n",
       "         0.0956729 ,  0.10900342,  0.10977173,  0.08292252]),\n",
       " 'std_score_time': array([ 0.0446663 ,  0.06258856,  0.03496163,  0.05011337,  0.05514127,\n",
       "         0.05545997,  0.04303402,  0.03013483,  0.03124195]),\n",
       " 'std_test_score': array([ 0.00769494,  0.00748588,  0.00750805,  0.00637455,  0.00701213,\n",
       "         0.00645415,  0.00211836,  0.00319054,  0.00701096]),\n",
       " 'std_train_score': array([ 0.00762117,  0.00754806,  0.00730687,  0.00588575,  0.00654582,\n",
       "         0.00613771,  0.00234911,  0.00324428,  0.0069329 ])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -1.808345 using {'max_depth': 8, 'min_child_weight': 4}\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nOd3dXdTV1XHzzbfjOA6nn34ymzcXekkbN67nvvv+hwkTAhx88MH9isiGDeu55ZY7mDRpEsceewR3\n3XUfl1zybU4++Tg6Ows/U3d3FzfddCurV6/iO9+5pE8R+fDDD3j11Ze56677cByHO+64lf33P5BI\npJsrrriKHXaYxhFHHEVra0uvuR988B5vvfUmv/jFr4hGI5x66lf6tH3//Q/kF7+4A4C33nqDlpYW\nUqkUL774V84++xxuu+0WTjzxFD71qU/zt7+9xh133MrChf8G9Bwudeed9zBxYhNXX/293H0TiQTX\nXXcDjuNwwgmf5+yzz+HYY79AU1MTu+66O7vuujvgFcZ89tmn+dGPfsq990rshiDkIyIyypg9ew4A\ngUCQ1tZWrrrqSsLhMNFotNfpe/Pmzce2bcLh8IDZ6fX1E3Jl40OhEDvsMA+AmppaEol4wdj583cG\nvMzvRKJ3xd8sq1atZJdddsOyLCzL4oILLmH9+nVMmzaD+vp6TNOksbGxZFXfVatWsWDBLpimSU1N\nLfPmze/zOYFAkFmzZvP+++9i2za77bYHb731Jhs3bmDOnLksX76U+++/lwce+CUAltXz17qtrZWa\nmprc+SV77bU3sVhX5vvbMZfJnj+nmD/+8Qk2b97EhReey4YN67FtH1OnTufAAw/qc44gjBdEREYB\n2Sq+AKbpBUEsXvwSmzZt5JprrqO1tZW//vXPvSrNVlCktyoVfefMmcsjj/wex3FwHIfLL7+QSy/9\ndlnzd9hhBx5++Dc4jkM8HmfFiuX9jj/00H/itttu4dBDD2f69BnceedtfPKTBwAwe/ZcvvrVr7HH\nHnuxcuUK3nyzJ12osXEikUg3ra2tNDY28u67/2DHHedmPmfv55imieMUfs//9m8X5a6zy4kiIILg\nISIyCshW8Y3HezyCXXbZjfvuW8R55/0rhmEwffoMtmzZvA2t7M1OOykOOOBTfPObZ+M4DscffyI+\nX3k1qry5B/GNb/wLkyY109g4sd/xBx10CNdddw2XXfZdpkyZwve+953cxvl5513EjTf+hEQiQTwe\n46KLLs/NM02TSy75Nt/61kXU1NTiug5K9e31KLULt99+C3Pn7sCHH36Q2xMRBKE0kidSBrFoksXP\nL8dnW6TSaSzbxLYtbJ+Jnbm2bDPz3mv3xpjYPiszxsTK9lnDG1k9FuPSh5P777+XU075Z/x+P9dc\n832OPPJwPv3pI7e1Wb0YLd9XMWJXZYxFu0ZbFd/tjs72GPqdDb2WOQaLYYDts/oQmqL32eusQJUY\n09kao6s7zhtvvsLjT/wOw/CWpLKvJ530VQ477J8Gbe+jj/6BZ5/9Y6/2c889n913H76zTN577x+5\nQ67yOfLIozn++BMHfd9wOMw553ydYDDI1KnT+dznPkd7e3zgiYIgDIh4ImWSiKeorQmwcWMn6VSa\nVNIhlXJIpdKkUw7JpNO7PXft9XljvL7suHQynRuTSqapxh+HaRo5EerxmDzPyJfzmnrEyiq4NvHl\nC16Bp5XnjeWNye6JjMXfyKqJ2FUZYldliCeyjfEHbCY0hkmk0lV9TjqdFRpPVDwB6rnOtveMcQgE\nbNrboxnRyhOoVOGc7L2i3cncuGpgWQa2z8LvtzFMSntWed5UsUdm+QpFLSd++R5YRsgsy6woaEAQ\nhOFFRGSUYVnef4z+QPlzBvsbhuu6OGnXE5SMIGU9q1QvQSohUHleVyrZW/xwIR5PEo+lcveoBvme\nVS/h8RV7WSb19SESydSo2M8ShO0dEZFxjGEYWLaBZZtUoFllUyxuruuW9rLyPa1kngeVFbIS3lix\n15W9TibSRCMJUikHJz38a4P5+1m+Is+q1H6Wr8izKh6TL3iGAx0dUe/+ltdnmoZ4WsKoRkREGDEM\nw1vmsn0WhHxVf57juEWC5AlRXW2QLVu6hmU/Kx5N0l3F/Swg5wH1vGZEJm8psPDV6qO9/H7TEvES\nykNEZBQQj8d55pmnyirA+OSTj1NfXz/suQv3338f++33iVypj8Gyfv26XM2qUvdfseJjVq5cwTe/\neUFB/8KFX+fqq69l2rTpQ3p+lq1bt3Dvvb/g8su/S3HqSnNzHe99+BaPPvp7rr76uoK+ZcuW0tnZ\n0asA480338Dbby8hHA4D8JOf3ERtbW3BmAH3s/KXC4s9raSDz2fR1Rkr8NByr+nMXljaIR5LZd5X\nZ3kwS1ZUsntbPUJjVU3AZI9r+0NEJI/Wtc8SaXuvz/4NpknaqewfbrhhVxpnfKbfMVLFd/gZ7iq+\nWr/PTTfdSkNDQ59zB7OflU+le1uu6+I4rrcEmCcyPe/zXlNpUunMMmDJ1z7m5u1tJeKpnPhVkwFF\nKOOV1dQEvLytUl5aL++tn34RryEhIjIKkCq+o7uK70EHHcKaNau5/vof09q6lc9//ji+8IXjKv+D\nHmYMw8CyjKpv9pfa2/KWCguDLnp5T0X9ffWl++lLpRwS8UTufTUzErJi0qcAlellNU4ME4kkyvbC\ntnfx2iYiopQ6HjhJa31aib7LgNMAB7hWa/1wXt8C4FVgitY6ppQ6ELgFSAHPaK2vHopdjTM+06/X\nIFV8CxkvVXwjkW5OOOFkTj31azhOmgsuOJcFC3Zl/vyd+rR5LJMvXoP1ugZDsXhNqA+xaVPnACI0\nsLj11Z8Nha+6eFnGoJYCe4/pf5mxqal2YGMGwYiLiFLqFuAYYEmJvgbgImA+UJMZ83Cmrx64EchP\nNb4DOAFYDjyhlNpHa/1mVT9AlZEqvr3Z1lV8A4EgJ5/8VYJB7zveb79PsHTph+NWRLYVxeLVMDFM\nMl3dvK0s+ftdA4lQOOSnrTVSkKtVtoClHaKRZG55cjjFa4/9ZnDwZ4b/7+y28EReBh4BzinR1w2s\nxBOQGjxvBKWUAdwFXAk8mmmrBwJa62WZ908DRwF9ikhjYxjbtoZkfHNz3ZDmlyKZrMOyDGpqAtTX\nh2huruO5556jvX0rt9/+X7S0tHDsscfS2BimpiZAbW2QhoYwwaAvZ49pGv3aZllmybG2bdLUVEsw\n6GPChBDJZJCamgDNzXXE4/6CecXsvfduPPHEIzQ11ZBOp1m4cCHf//738fvt3Byfz2LixJqC+4fD\nfvbdd3cef/z3NDXVEIvFWLXqYyZOrOnzWZ///LHcffdtHHnkkcyaNYs777yDQw89mObmOnbaaT5n\nnXUW++67L8uWLeP1119n4sQafD6LnXeeQzwexbKSTJw4kWXLNDNmzOjz+6ut9ezLt2PZsmVcfPHF\nPPLIIziOw/vv/4PTTjulKn8XqnHP4UDs2jY4aS960IsK9AQpmcxECOYCNjLh7fnvMxGF2b5UKs2u\ne02vyvdVNRFRSp0NXFLUfKbW+iGl1OH9TF0NvAdYQDZ05irgCa31W0qp7Lh6IP+s0k5gXn82tbZG\nyjO+D6q1nOU4fqLROC0tHQSDtWze3MmMGfP4+OOVnHzyqRiGwbRp0/nwwxV0d8cJBmO0tUWIx5Ns\n3txJc3MdjuP2a1t+f/51KuWwdWsXsViS9vYonZ0xIpEEmzd3Eo/HSaedPu87adJM9t13f0488eRc\nFd+uriTJZDpnVzKZpqWlu9f9J02ayX77HcBxxx3PpEnNTJjQSEtLN4FA6WftsccnufLKK7nggsuZ\nMmUK7777Lhdd9C02b+7kG984r1cV35aWbpLJNFu3dnPhhZdz5pln56r4zpkzp+D7y/9OZs3akdtv\nvyTVQhcAABBnSURBVIVJk6YXVPE96qjP8pWvnIht23z2s5+joWHqsP9dGIvlMqrJeLXL8nm5R4EK\n//seYtmTPvu2Se2sjIicq7U+taj9S3jCc2ym6WngW8CDwJpM24HAa8AXgMVa610zcy8CfFrrG/p6\n7lBqZ8H4/Us7WEaLXVLFd2iIXZUxFu3anmpntQJRIK61dpVSbUCD1jq3YK6UWgEcndlYTyildsTb\nEzkGGNLG+vbOiy/+hV//+oFe7VLFV6r4CkK1GBUiopS6FFiqtX5MKXUUsFgp5QAvAs/2M/Vc4AG8\npa9ntNavVt/a0cvBBx9WlQOUjjvuKxx3XN/RU8PFrrvuzq233jXs9z3hhFM44YRTcu+9zXQREUEY\nDqQUfJlEYkkaGmtob4vg95lY5ugpxDcW3edqInZVhthVGWPRru1pOWtUsnJDJ9f88vWCcDvTMPBl\nivBlf/zZa8s7g8Nnmfh9mfe2ic+2CsbaBfOszLye8bn75c3z2Sbmdp6cJAjC2EFEpAyaG4IcvvcM\n4mmHru4EyZST+0mk0iRTDvFkmq5IkmTaa68mtmX0iJVtEQzYmAY50bFtE39WeEoKU6EoFYqdVVoY\nbRNbSkMIglCEiEgZhIM+Tj9Gle0Ouq5LKp0vNE6B8CRTaZJph0TSyYlOfl9ufCZGPDsmkUlcKr5n\ndzRJPJkimXJIVaH8eT6lhalIlDLiU1cbJJ1Ml/Su7KJ5Oc/MMvFnvLj8+1lSEl0QRiUiIlXAMIzM\nb/TlJTYOtYpvvrg5jlskTOlC0ckTpkQynRv7l2d+x8wddmPStB1Li1XaS2bqETTvNRZJkkzFSaS8\n7NpkpIX1bzzI7IPPL7C7ZemfCTXtSKJrE4muTTTv8rmC/lUv3sq0fU/DF57Yx3dKSbHyWaWX/ZKx\nDpa8+AhHffkbvYSpaWKYd978G4v/+hTnXPC9gvutW/MxsUg3++67X268aRq88spL3Hvv3biui1K7\ncNll3xFREwRERAp4avVm3mnp6rPfskzS6cqWqvaYWMuxs5r7HTOcVXxN0yBgWgR8lWXmf+YTxXmh\nlZN2HFatXsOP1j3Of/zbQdTWh9i4qTMjZvuQTDm88PzTrFvncMzndikQpvveCnDY3tMJ1U0qEL+c\nYBUJYyKZpjuazPWXZOrRPLV4VcmuyJYVtK9p58aHCqvvbNHPYAfraHghLzHVibPyxdtY8E/nEa6p\nZ8kH/8cVt/8ftXUTenlMJYWueHmxRLttm6QMk46OWM4jsy0TW871EEY5IiKjgLFWxbezo43/uO7/\nlaziO2dqHcRrOHjPaQVVfE0nyuc/NbfkeSLZKr5XZqv4fvQWN+VV8T366GO5/vpricVi+PwBzj3v\nchLJFD/7j6v53o9u5W+vvcyjv/slgWCYYKiGWXN3ZMonFH9c00nywwfp7mpn7s77svPeh/PIC0tI\nmhZ77b47G1ZrQnWTcLBoaJrJhn88TqRjC007HEhnwkfLxs6qLx+CtwdmZ0TF25vy3vsyB1N515kx\n+QKUGZv/3pcRpkKhMvHZxc/oeY7pt+mKJnPvZWlRyEdEJI9jZzX36zVIFd9CRksV39tv/09OOunU\nXBXf3zz4CxYu/Df8PosdptZyxYN3FFTx3XFmAzvv3MzzNiy64/ZcFd+bfnQFvvbjaWpq4stf7in1\n/swzT3Hrqx9z770PEAqFOe+8b/Cdi09g9uw5OK7rlSsfYNkvlReEUfCT3RtLpbF8Fl3dXtnzZNor\nxpdMe/tr2bZU2tv3isaTmevq74MVY0CheOWus2JlFAiUJ1glRC4TIDKwQHr3LHyGSag2SSKZxpaI\nxW2KiMgoQ6r49mZbV/Gtr5/AggW70tQ0KXOPffnoow+ZPXsOpmHg91n4K1w+LMVgf0nxAjkywRwZ\nwUllBSjl5MTG6+tjXLFQpdzctWVbdHXH+31GPJGmO53MPcMZ4fwz6/+3d+dBUlVXHMe/0wzGZSSO\nBUFxgyg5UoSohRRxVIImxqUUJRSlEmO5YBlCRQK4ohVLs5A/tAwquBWKVlIxlgquURJxYRGTEDcw\nHqIChTEqmCEksg105497e6YZpnumm+n3Bvl9/mH6Ld2nH7f7vHv73fMyNS29p9oMtZkyklfrJFWy\nd9d+gmzauo1cLrfb9NaURLqAmpoMuVwY189kQsNbvHghn376CTffPJXGxkZeeeVFWk8MLaeNltOg\nO7rtYYf1Zc6cx8hms2SzWa688gomTbq6Q/v369eP2bMfIZvNsnnzZlau/KDk9sOGncT06dMYNmw4\nffocxD33TGfIkKEAHHpoX84//wIGDTqKVatW8vrrS5r3q6/fnw0bPqexsZH6+nqWLVvK4Yf3je9z\nx9fJZDJks9sfZ7MjWbHifdatW0ddXR3Llr3NiBHt/36VlHAhR/hi3KsKz19JcstmcwXJK1eQdHZM\nUq17WU2FiS9ecdhW8urWLcPnG7a0nSC3Zdm4qYn1BQky6WnVlQxDdms1/Nih3l4He3dVe59Ve2bp\nsPr6epqatrJ5c0uPYMCAgcyaNZPx4y+jpqaGPn0OYu3aNSlGuaP+/Y2hQ49j3LhLm6v4dm99Q/OS\n+zYwduyF9OzZi/r6tq/KymtoOJGpU29m8uRr6d27NzfccE3z7W/Hj5+wQxXfvEwmw8SJV3PVVROa\nq/iaFe/1mA1gxoxp9O3bb7sqvpdfPp5Jk8IVZyef/J2SPScJJ0N7ZDqnh1ZMOcktl8uxrTmxFU9U\nLcsKk2A+eeVaJbK439btt6vplmHDxqYuNww54sSvcs7xfTv9eVX2pAxfxHIG1dRV4lIV352juMpT\n3nyyzhmG3Jot1rtrmbN2WkM/Bh22X6XvSWVPdgeq4ts2VfGVrqjaw5CtVSvpqidShl39zCdpiqs8\niqs8iqs81SrA2HVK0YqIyC5HSURERCqmJCIiIhVL5Yd1MxsJjHb3MW2smwyMAbLAL919dsG6I4HX\ngN7x9rgjgVuA1XGTG9395aq/ARERAVJIImY2jXA/9DfaWLcfMAE4AtgnbjM7rusB3Mr29zUdDFzt\n7o9VOWwREWlDGsNZi4BxRdZ9DqwiJJB9CL0RzKwGuBeYAhSUV2UwcImZzTezW81MlyyLiCSoal+6\nZnYp0Lq++MXu/nszG15i19XAO0A3YGpcdiPwjLu/aWaF2/4RmAOsAO4GfgjcWeyJ6+v3praD9/go\nplevfXdq/2pRXOVRXOVRXOXZneKqWhJx95nAzDJ3Ox04EOgXHz9vZguBC4APY2I6AJgLDAPud/d1\nAGb2BDCq1JPX1nbbPSqiiYgkpKtdndUIbAQ2u/smYB2wn7sf4e7D3X048DHw3TjE9ZaZHRz3/Taw\npK0nFRGR6ugSScTMJpnZCHefD/wFWGxmrwLLCUNWO3D3HDAWeNzMXgb2Bu5LKmYREdnNyp6IiEjn\n6hI9ERER2TUpiYiISMWUREREpGJKIiIiUjHN8I7M7DpgBLAHMCPOc8mvOwv4KbCVMDflPjPLADOA\nowilWMa6+3sJx3U+8JMY19vAj9w9a2Z/A9bHzVa4+8UJxzWRcOVc/n6+lwP/IMXjZWYHAA8XbHo0\ncK27313t42VmFwEXxYd7xtc+oGCOUyrtqwNxpdm+2ostlTZWKq602piZdQceBPoC24DL3P3dgvVV\nbV9KIkCcQd8AHE+4VPjKgnXdgduAIYSyLAvN7Mm47Z7ufpyZfZNQ1+vsBOPaC/g5MMjdN5jZ74Az\nzWwuUBPn1FRFqbiiwcCF7r6kYJ/vkeLxcvePgeFxu+OAXwD3mdmeVPl4ufssYFZ87elsP0k2tfbV\nTlypta/2YotSaWOl4kqxjZ0B1Lp7g5mdEl93VIyj6u1Lw1nBqYQzrdnAU8DTBesGAO+5e6O7bwEW\nEGbLnwA8B+Dui4FjE45rM9Dg7vlaYrXAJsKZxd5mNtfM5sUGkmRcED7g15nZgtgzgPSPF9Bch+0O\nYJy7byOZ45V/7WOBge5+b8HiNNtXqbjSbF/txQbptbH24kqjjS0HamPvogfQVLCu6u1LSSToSTiI\nown1t34bGwKE/5T/FGz7X+DLbSzfVoUCkEXjcvesu38CYGY/BuoIEzM3EMrjn1qwT2JxRQ/H5ScD\nJ5jZmaR8vAqcBSxzd4+PkzheeVOAm1otS7N9FY0r5fZVMrYorTbWXlyQfBv7H2Eo613ChOvbC9ZV\nvX0piQSfAc+7+5b4H78J6BXXrQcKq5btSyjH0np5xt23JhgXZpYxs1uAU4BRcRb/cuA37p5z9+Xx\nOQ5MKq74pf1rd18bz3yeAY6hCxyv6AJCRei8JI5X/jYH5u4vtlqVZvsqFVea7atkbCm3sZLHLEq6\njU0ktPuvEXo9D8YhNEigfSmJBAuA08ysxsz6EMrQfxbX/R3ob2b7m9kehK7gq8BCwlgksXv6dsJx\nAdxD+HHvnIJhh0sI45vEfXoA/0owrh7AUjOrix/2kwk1zbrC8YLQU1lU8DiJ4wWh3bzQxvI021ep\nuCC99tVebGm2sVJx5SXdxhpp6VX8G+hOqIIOCbQv/bAOuPvTZjYM+DMhsY4HzjWzOne/18wmAc/H\ndfe7+z/NbDZwipktAmqATr9CpVRcwF+BS4H5wDwLJfKnESonzzKzBUAOuKSzz8Y6cLymAC8SxtVf\ncPdn43htascrxtULWB/PqPOqfrwiAz5ofmA2Bki1fZWKixTbV3uxpdnGOhBXGm3sNuB+M5tPuCpx\nCnB2Ut9fqp0lIiIV03CWiIhUTElEREQqpiQiIiIVUxIREZGKKYmIiEjFlEREuiAzm2Wh2F8l+95k\nZifGv1+yUFNMpCqURES+eL5Fy2QzkarSPBGREuJZ/PWECVmHA48SZgefE5edQajV9QPCDPkscC6h\nntESwhf6+4TJe9e5+zNFXqeGMKv5TOAjQhKY6e6zzOxCQkn2THzO8e6+yczWEIpMDibURPo+YUby\nDOBjYCShEOCHhEJ89cAEd3+qc46OiHoiIh0xlDCjdyAwDljj7scCbwHnERLKcHf/OjCHcN+N1cA1\nwF3AjcCiYgkkGkWo/zSQkJSOADCzgcBlhIq6RwOf0lLivifwkrt/g1CQ8HZ3f4iQsMa6e76UxTp3\nHwxcQbivhEinURIRad9Sd18d60etpaVu0irC2f0Y4Dwzm0qo4FoH4O4PABvj+sntvMZw4HF3b3L3\nNcCzcflJQH9gsZm9Qbjnw5Fx3Sbgofj3g4QaUm2ZE/9dRkg8Ip1GtbNE2rel1ePCukeHEAra3Qn8\ngTCMdAxArKR6COFzdjDgFJdj+5O6/Gt0Ax5x9yvic9bR8rnNFtRoyrSKq614c4QhOJFOo56IyM4Z\nQrjpz23Aa8DptPyo/TNgHqFU9wOxQGAxfwJGm9mXzKweOC0ufwkYaWZfib+b3EX4fQTCjY7Oin9f\nTEhiEJKGThAlEUoiIjtnLpAxs3eAxcBKoJ+F26OOBq5390cJJbpb30a4mbs/QUgYS4EngXfi8jcJ\nNz+aRxiOygC/Kth1tJm9RbjhUT65PAfcbWYNnfMWRYrT1Vkiuygzy7m7hqckVeryiiQkTgC8o8jq\nM9z9oyTjEekM6omIiEjF9JuIiIhUTElEREQqpiQiIiIVUxIREZGKKYmIiEjF/g/5luS5P1wKIQAA\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fd38550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch1.best_score_, gsearch1.best_params_))\n",
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_2.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )\n",
    "pyplot.savefig( 'max_depth_vs_min_child_weght2.png' )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
